home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / basic / _vector.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  4.2 KB  |  230 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  _vector.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16. #include <LEDA/vector.h>
  17.  
  18. #include <math.h>
  19.  
  20. void vector::check_dimensions(const vector& vec) const
  21. { if (d!=vec.d)
  22.    error_handler(1,"vector arguments have different dimensions.");
  23.  }
  24.  
  25.  
  26. vector::vector(int n) 
  27.  if (n<0) error_handler(1,"vector: negative dimension."); 
  28.  d = n; 
  29.  v = nil;
  30.  if (d > 0)
  31.  { if (d < 32)
  32.        v = (double*)allocate_bytes(d*sizeof(double));
  33.    else
  34.        v = new double[d];
  35.  
  36.    while (n--) v[n] = 0.0;
  37.   }
  38. }
  39.  
  40. vector::~vector() 
  41. { if (v) 
  42.     if (d < 32) 
  43.        deallocate_bytes(v,d*sizeof(double));
  44.     else
  45.        delete v;
  46. }
  47.  
  48.  
  49. vector::vector(const vector& p) 
  50. { d = p.d; 
  51.   v = nil;
  52.   if (d > 0) 
  53.   { if (d < 32)
  54.         v = (double*)allocate_bytes(d*sizeof(double));
  55.     else
  56.         v = new double[d];
  57.     for(int i=0; i<d; i++) v[i] = p.v[i];
  58.    }
  59. }
  60.  
  61.  
  62.  
  63. vector::vector(double x, double y) 
  64. { v = (double*)allocate_bytes(2*sizeof(double));
  65.   d = 2;
  66.   v[0] = x;
  67.   v[1] = y;
  68.  }
  69.  
  70. vector::vector(double x, double y, double z) 
  71. { v = (double*)allocate_bytes(3*sizeof(double));
  72.   d = 3;
  73.   v[0] = x;
  74.   v[1] = y;
  75.   v[2] = z;
  76.  }
  77.  
  78. double  vector::operator[](int i) const
  79. { if (i<0 || i>=d)  error_handler(1,"vector: index out of range ");
  80.   return v[i]; 
  81. }
  82.  
  83. double& vector::operator[](int i)
  84. { if (i<0 || i>=d)  error_handler(1,"vector: index out of range ");
  85.   return v[i]; 
  86. }
  87.  
  88.  
  89. vector& vector::operator+=(const vector& vec)
  90. { check_dimensions(vec);
  91.   register int n = d;
  92.   while (n--) v[n] += vec.v[n];
  93.   return *this;
  94. }
  95.  
  96. vector& vector::operator-=(const vector& vec)
  97. { check_dimensions(vec);
  98.   register int n = d;
  99.   while (n--) v[n] -= vec.v[n];
  100.   return *this;
  101. }
  102.  
  103. vector vector::operator+(const vector& vec) const
  104. { check_dimensions(vec);
  105.   register int n = d;
  106.   vector result(n);
  107.   while (n--) result.v[n] = v[n]+vec.v[n];
  108.   return result;
  109. }
  110.  
  111. vector vector::operator-(const vector& vec) const
  112. { check_dimensions(vec);
  113.   register int n = d;
  114.   vector result(n);
  115.   while (n--) result.v[n] = v[n]-vec.v[n];
  116.   return result;
  117. }
  118.  
  119. vector vector::operator-() const  // unary minus
  120. { register int n = d;
  121.   vector result(n);
  122.   while (n--) result.v[n] = -v[n];
  123.   return result;
  124. }
  125.  
  126.  
  127. vector vector::operator*(double x) const
  128. { int n = d;
  129.   vector result(n);
  130.   while (n--) result.v[n] = v[n] * x;
  131.   return result;
  132. }
  133.  
  134. vector vector::operator/(double x) const
  135. { int n = d;
  136.   vector result(n);
  137.   while (n--) result.v[n] = v[n] / x;
  138.   return result;
  139. }
  140.  
  141. //friend
  142. vector operator*(double f, const vector& v) { return v*f;     } 
  143.  
  144. double vector::operator*(const vector& vec) const
  145. { check_dimensions(vec);
  146.   double result=0;
  147.   register int n = d;
  148.   while (n--) result = result+v[n]*vec.v[n];
  149.   return result;
  150. }
  151.  
  152. vector& vector::operator=(const vector& vec)
  153. { register int n = vec.d;
  154.  
  155.   if (n != d)
  156.   { 
  157.     if (v)
  158.     { if (n < 32)
  159.           deallocate_bytes(v,d*sizeof(double));
  160.       else
  161.           delete v;
  162.      }
  163.  
  164.     if (d < 32)
  165.          v = (double*)allocate_bytes(n*sizeof(double));
  166.     else
  167.          v = new double[n];
  168.     d = n;
  169.    }
  170.  
  171.   while (n--) v[n] = vec.v[n];
  172.  
  173.   return *this;
  174. }
  175.  
  176.  
  177. int vector::operator==(const vector& vec)  const
  178. { if (vec.d != d) return false;
  179.   int i = 0;
  180.   while ((i<d) && (v[i]==vec.v[i])) i++;
  181.   return (i==d) ? true : false;
  182.  }
  183.  
  184.  
  185. ostream& operator<<(ostream& s, const vector& v)
  186. { int i;
  187.   char buf[16];
  188.   for (i=0;i<v.d;i++) 
  189.   { sprintf(buf,"%7.2f ",v[i]);
  190.     s << buf;
  191.    }
  192.   return s;
  193. }
  194.  
  195. istream& operator>>(istream& s, vector& x)
  196. { int i=0;
  197.   while (i<x.d && s >> x.v[i++]);
  198.   return s;
  199. }
  200.  
  201. double vector::length() const { return sqrt(*this * *this); }
  202.  
  203. double vector::angle(const vector& y)  const
  204. { double l = length();
  205.   double yl = y.length();
  206.  
  207.   if ( l==0 || yl==0)
  208.     error_handler(1,"angle: zero argument\n");
  209.  
  210.   return  acos((*this)*y/(l*yl));  
  211. }
  212.  
  213.  
  214.  
  215. int compare(const vector& v1, const vector& v2)
  216. { register int i;
  217.  
  218.   if (v1.dim() != v2.dim())
  219.     error_handler(1,"compare(vector,vector): different dimensions\n");
  220.  
  221.   for(i=0; i < v1.dim() && v1[i]==v2[i]; i++);
  222.  
  223.   if (i == v1.dim()) return 0;
  224.    
  225.   return (v1[i] < v2[i]) ?  -1 : 1;
  226. }
  227.  
  228.